
import { Role } from "@/business/role/entities/role.entity";
import { CommonEntity } from "@/common/common-entity";
import { ApiPropertyOptional } from "@nestjs/swagger";
import { Column, Entity, ManyToMany, Tree, TreeChildren, TreeParent } from "typeorm";

@Entity('menu', { orderBy: { order: 'ASC' } })
// @Tree 装饰器 -实体应该被当作树形结构来处理
@Tree('closure-table') // 闭包模式实现树形结构 - 闭包表模式是一种存储树形结构数据的方法，它通过一个额外的表（闭包表）来存储每个节点与其所有祖先节点之间的关系
export class Menu extends CommonEntity{
  @ApiPropertyOptional({description: '类型, 0目录,1菜单,2按钮'})
  @Column({
    type: 'tinyint',
    width: 1,
    default: 0,
    comment: '类型; 0目录 1菜单 2按钮',
  })
  type: number;


  @ApiPropertyOptional({ description: '菜单名称' })
  @Column({ type: 'varchar', length: 32, comment: '菜单名称' })
  name: string;

  @ApiPropertyOptional({ description: '权限标识' })
  @Column({ type: 'varchar', nullable: true, length: 32, comment: '权限标识' })
  mark: string | null;

  @ApiPropertyOptional({ description: '图标名称' })
  @Column({ type: 'varchar', nullable: true, length: 32, comment: '图标名称' })
  icon: string | null;

  @ApiPropertyOptional({ description: '组件名称' })
  @Column({ type: 'varchar', nullable: true, length: 32, comment: '组件名称' })
  componentName: string | null;

  @ApiPropertyOptional({ description: '路由地址' })
  @Column({
    type: 'varchar',
    nullable: true,
    length: 128,
    default: '/',
    comment: '路由地址',
  })
  routePath: string;

  @ApiPropertyOptional({ description: '组件路径' })
  @Column({
    type: 'varchar',
    nullable: true,
    length: 128,
    default: 'Layout',
    comment: '组件路径',
  })
  componentPath: string | null;

  @ApiPropertyOptional({ description: '菜单排序' })
  @Column({ type: 'smallint', nullable: true, default: 99, comment: '菜单排序' })
  order: number | null;


  @ApiPropertyOptional({ description: '菜单是否显示,1显示,0不显示' })
  @Column({
    type: 'tinyint',
    nullable: true,
    width: 1,
    default: 1,
    comment: '菜单是否显示,1显示,0不显示',
  })
  display: number;

  @ApiPropertyOptional({ description: '是否快捷菜单' })
  @Column({
    type: 'tinyint',
    nullable: true,
    width: 1,
    default: 0,
    comment: '是否快捷菜单',
  })
  quickMenu: number;

  @ApiPropertyOptional({ description: '子菜单' })
  @TreeChildren() // 适用于表示具有层级关系 - 装饰一个属性，该属性表示当前节点的所有子节点
  children: Menu[]; // children 属性被装饰为 Menu[] 类型的数组，表示每个菜单项可以有多个子菜单项

  @ApiPropertyOptional({ description: '父级菜单' })
  @TreeParent() // 适用于表示具有层级关系 - 装饰一个属性，该属性表示当前节点的父节点
  parent: Menu; // parent 属性被装饰为 Menu 类型，表示每个菜单项都可以有一个父菜单项（除了根节点之外）

  // 菜单 多对多 角色
  @ApiPropertyOptional({description: '拥有的角色', type: [Role]})
  @ManyToMany(()=>Role, (role)=> role.menus)
  roles: Role[]
}
